import {
  PipeTransform,
  Injectable,
  ArgumentMetadata,
  BadRequestException,
} from '@nestjs/common';

/**
 * 自定义表单数据解析管道
 * 基于 Java 框架中的 DiyFormDriver 转换逻辑
 * 对应 Java: DiyFormDriver.convert()
 */
@Injectable()
export class ParseDiyFormPipe implements PipeTransform<any, any> {
  transform(value: any, metadata: ArgumentMetadata): any {
    if (!value) {
      return value;
    }

    // 根据组件类型进行数据转换
    const componentType = value.componentType;
    const fieldValue = value.fieldValue;

    switch (componentType) {
      case 'FormRadio':
      case 'FormCheckbox':
        // 单选和多选需要解析为数组
        if (typeof fieldValue === 'string') {
          try {
            return JSON.parse(fieldValue);
          } catch {
            return [fieldValue];
          }
        }
        return fieldValue;

      case 'FormDate':
        // 日期直接返回
        return fieldValue;

      case 'FormDateScope':
      case 'FormTimeScope':
        // 日期范围和时间范围需要解析为对象
        if (typeof fieldValue === 'string') {
          try {
            return JSON.parse(fieldValue);
          } catch {
            throw new BadRequestException('日期范围格式错误');
          }
        }
        return fieldValue;

      case 'FormImage':
        // 图片需要解析为数组
        if (typeof fieldValue === 'string') {
          try {
            return JSON.parse(fieldValue);
          } catch {
            return [fieldValue];
          }
        }
        return fieldValue;

      default:
        // 其他类型直接返回
        return fieldValue;
    }
  }
}
